
import java.util.Scanner;

/*
 * 
 * Universidad del Valle de Guatemala
 * Algoritmos y Estructura de Datos
 * Guatemala, Julio 2012   
 * Diego Castillo - 10098
 * Clase que utiliza la implementacion del stack, operando valores de acuerdo 
 * a la notacion postfix. Utilizando las caracteristicas del Stack para ello. 
 * 
 */
/**    
 * 
 * 
 * @author onedacc
 */
public class DriverStack {
    
    /**
     * 
     * @param args
     */
    public static void main(String args[]){
         
         
         
         Scanner ingreso = new Scanner(System.in);
         StackVector<Double> pila = new StackVector<Double>();
         double op1, op2, resul, agregar;
         int opcion, opcion2;
         

         System.out.println();  
         System.out.println("|   EXPRESION FORMATO POSTFIX   |");
         op1 = obtenerNumero("| -. Ingrese primer operando    | --> ",false);
         pila.push(op1); 
         op2 = obtenerNumero("| -. Ingrese segundo operando   | --> ",false);
         pila.push(op2);
         System.out.println(pila);
         do{
            
             menu();
             opcion =(int) obtenerNumero("   ------>  ",false);
             
             if(pila.size()==1){
                 System.out.println("ADVERTENCIA!! Necesita agregar operando");
                 opcion2 = (int)obtenerNumero("---Opciones:  1.Agregar operando  2.Terminar programa", false);
                 switch(opcion2){
                     case 1:
                         opcion=5;
                         break;
                     case 2:
                         opcion=6;
                         break;
                     default:
                         opcion=0;
                 }
                 
             }
             switch(opcion){
                 
                 case 1:
                     op1= pila.pop();
                     op2= pila.pop();
                     resul= op2+op1;
                     pila.push(resul);
                     System.out.println(pila);
                     break;
                     
                 case 2:
                     op1=pila.pop();
                     op2=pila.pop();
                     resul= op2-op1;
                     pila.push(resul);
                     System.out.println(pila);
                     break;
                     
                 case 3:
                     op1=pila.pop();
                     op2=pila.pop();
                     resul= op2*op1;
                     pila.push(resul);
                     System.out.println(pila);
                     break;
                     
                 case 4:
                     op1=pila.pop();
                     op2=pila.pop();
                     resul=op2/op1;
                     pila.push(resul);
                     System.out.println(pila);
                     break;
                 case 5:
                     agregar = obtenerNumero("Ingrese Operando--->  ", false);
                     pila.push(agregar);
                     System.out.println(pila);
                     break;
                 default:
                	System.out.println("Error ----  opcion invalida");
                    
             }
    
             
         } while(opcion!=6);
         System.out.println();
         System.out.println("   El programa ha terminado!!!");
         
     }
     
     
     /**
      * 
      */
     public static void menu(){
       System.out.println();
       System.out.println("|    SELECCIONE UNA  OPCION     |");
       System.out.println("| 1. Sumar.                     |");
       System.out.println("| 2. Restar                     |");
       System.out.println("| 3. Multiplicar                |");
       System.out.println("| 4. Dividir                    |");
       System.out.println("| 5. Nuevo Operando.            |");
       System.out.println("| 6. Salir del programa.        |");

	}
     
     
     /**
      * 
      * @param mensaje
      * @param mostrar
      * @return
      */
     public static double obtenerNumero(String mensaje, boolean mostrar){
       Scanner ingreso = new Scanner(System.in);
       int num = -1;
       
       System.out.print(mensaje);
       try{
           num = ingreso.nextInt();
       }
       catch(Exception excep){
           if (mostrar)
               System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
       }
       finally{
           ingreso.nextLine();//Atrapar el ENTER
       }
       return num;
    }
     
     
    
}
